/*
 * ************************************************
 *
 *              STM32F103C8T6 Balance Car
 *
 *  CPU: STM32F103C8
 *  PIN: PA1
 *
 * ************************************************
 */

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "Timer.h"
#include "Serial.h"

uint8_t mode = 0;
uint8_t speedflag = 0;
uint8_t turn = 0;
uint16_t speed = 170;
uint16_t circle = 1;
uint8_t FLAG = 0;

uint8_t func_index = 0;
void (*current_operation_index)();

void func1(void);
void func2(void);
void func3(void);
void func1_1(void);
void func1_2(void);
void func1_3(void);
void func2_1(void);
void func3_1(void);
void func1_1_0(void);
void func1_2_0(void);

typedef struct {
    uint8_t current;    // 当前索引值
    uint8_t up;         // 向上翻索引值
    uint8_t down;       // 向下翻索引值
    uint8_t enter;      // 确认索引值
    void (*current_operation)();    // 当前执行函数
} key_table;

key_table const table[10]={
    // 数组第一位：当前索引值
    // 数组第二位：向上翻索引值
    // 数组第三位：向下翻索引值
    // 数组第四位：确认索引值
    // 数组第五位：当前执行函数
    {0,2,1,3,func1},    // 第一层，第一个页面
    {1,0,2,6,func2},    // 第一层，第二个页面
    {2,1,0,7,func3},    // 第一层，第三个页面
    {3,5,4,8,func1_1},  // 第二层，第一个页面
    {4,3,5,9,func1_2},  // 第二层，第二个页面
    {5,4,3,0,func1_3},  // 第二层，第三个页面
    {6,10,10,1,func2_1},  // 第二层，执行函数
    {7,10,10,2,func3_1},  // 第二层，执行函数
    {8,10,10,3,func1_1_0},  // 第二层，执行函数
    {9,10,10,4,func1_2_0},  // 第二层，执行函数
};


int main()
{
    OLED_Init();
    Key_Init();
    Timer_Init();
    // Serial_Init();

    // Serial_SendByte(0x41);

    // uint8_t MyArray[] = {0x42, 0x43, 0x44, 0x45};
    // Serial_SendArray(MyArray, 4);
    // Serial_SendString("\r\nNum1=");
    // Serial_SendNumber(111,3);

    // char String[100];
    // sprintf(String, "\r\nNumber3=%d", 333);
    // Serial_SendString(String);

    // Serial_Printf("\r\nNum4=%d", 444);
    // Serial_Printf("\r\n");
    
    OLED_Clear();
    OLED_ShowString( 0, 0,"USART1 Test", OLED_8X16);
    // OLED_ShowString( 0, 0,"[ JiangXie Tech]", OLED_8X16);
    // OLED_ShowSignedNum(0, 16, Num1, 8, OLED_8X16);
    
    OLED_Update();

    while (1) {
        // OLED_ShowSignedNum(0, 16, Num1, 8, OLED_8X16);
        // // OLED_SignShowNum(0, 32, Num2, 5, OLED_8X16);
        // OLED_Update();
        // Delay_ms(100);
        if (Key_Check(KEY_1, KEY_DOWN)) {
            func_index = table[func_index].up;
        }
        if (Key_Check(KEY_2, KEY_DOWN)) {
            func_index = table[func_index].down;
        }
        if (Key_Check(KEY_3, KEY_DOWN)) {
            func_index = table[func_index].enter;
        }
        current_operation_index = table[func_index].current_operation;
        (*current_operation_index)();
    }
}

void func1(void){
    OLED_Clear();
    OLED_ShowString(32, 0,"OLED_MENU", OLED_8X16);
    OLED_ShowString(32, 16,"Step Motor", OLED_8X16);
    OLED_ShowString(32, 32,"Pointer", OLED_8X16);
    OLED_ShowString(32, 48,"Draw", OLED_8X16);
    OLED_ShowString(0, 16, "->>", OLED_8X16);
    if (mode) {
        OLED_ShowString(104, 48, "OFF", OLED_8X16);
    } else {
        OLED_ShowString(104, 48, "ON", OLED_8X16);
    }
    OLED_Update();
}

void func2(void)
{
    OLED_ClearArea(0, 0, 32, 64);
    OLED_ShowString(0, 32, "->>", OLED_8X16);
    OLED_Update();
}

void func3(void)
{
    OLED_ClearArea(0, 0, 32, 64);
    OLED_ShowString(0, 48, "->>", OLED_8X16);
    OLED_Update();
}

void func1_1(void)
{
    OLED_Clear();
    OLED_ShowString(32, 0,"Motor", OLED_8X16);
    OLED_ShowString(32, 16,"MotorSpeed", OLED_8X16);
    OLED_ShowString(32, 32,"MotorSet", OLED_8X16);
    OLED_ShowString(32, 48,"Return", OLED_8X16);
    OLED_ShowString(0, 16, "->>", OLED_8X16);
    if (speedflag) {
        OLED_ShowString(104, 32, "ON", OLED_8X16);
    } else {
        OLED_ShowString(104, 32, "OFF", OLED_8X16);
    }
    OLED_Update();
}
void func1_2(void)
{
    OLED_ClearArea(0, 0, 32, 64);
    OLED_ShowString(0, 32, "->>", OLED_8X16);
    OLED_Update();
}
void func1_3(void)
{
    OLED_ClearArea(0, 0, 32, 64);
    OLED_ShowString(0, 48, "->>", OLED_8X16);
    OLED_Update();
}

void func2_1(void)
{}

void func3_1(void)
{}

void func1_1_0(void)
{
    OLED_Clear();
    OLED_ShowString(0, 0,"OK", OLED_6X8);
    OLED_ShowString(32, 8,"Speed", OLED_8X16);
    OLED_ShowString(32, 24,"Mode", OLED_8X16);
    OLED_ShowString(32, 40,"Count", OLED_8X16);

    OLED_ShowNum(100, 8, 200-speed, 3, OLED_8X16);
    OLED_ShowNum(100, 24, turn, 1, OLED_8X16);
    OLED_ShowNum(100, 40, circle, 1, OLED_8X16);
    OLED_DrawLine(33, 5, 127, 5);
    OLED_DrawLine(33, 60, 127, 60);
    if (Key_Check(KEY_4, KEY_DOWN)) {
        func1();
    }
    OLED_Update();
}

void func1_2_0(void)
{}

void TIM1_UP_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM1, TIM_IT_Update) == SET)
	{
		Key_Tick();
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
	}
}
